
#include "..\Inc\includes.h"

/**************************************************************************
 * 函数名		：ButtonCheckOperation()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2018-09-30
 * 函数描述 ：按键检测操作。
 *************************************************************************/
void ButtonCheckOperation(void)
{
	unsigned char						u8_button_buffer = 0,																						//
													u8_read_data = 0;
	static unsigned char		u8_button_trigger = 0;

	static unsigned int			u16_key_long_press_time = 0;
		

	u8_button_buffer = ((0x7B|P3)&(0xFD|P1));																								//将三个按键的端口状态合并到一个寄存器中
	u8_read_data = u8_button_buffer^ 0xFF; 																									// 1，将原来为0的位变成1，原来为1的位变成0，即按下的按键为1,没按的都为0
	u8_button_trigger = u8_read_data& (u8_read_data^ U8_KeyValue);      										// 2,如果是第一次按u8_button_trigger将出现一次按下的键位为1，其它时候都为0
	U8_KeyValue = u8_read_data;                                															// 3，只要按键没有松开，这个值永远是键位值
	
	if (u8_button_trigger!=NO_KEY)																													//有键按下
	{
		u16_key_long_press_time = 0;																													//长按计数器清零
		KeyReleaseFlag = TRUE;																																//键释放标志置位表示键已按下
		U16_SetStateSilencePeriod = 0;																												//静默时间计数清零
	}

	
	if ((++u16_key_long_press_time)>400)																										//长按键时间为2秒
	{
		U16_SetStateSilencePeriod = 0;																												//静默时间计数清零
		PowerKeyShortPressFlag = FALSE;
		UpKeyShortPressFlag = FALSE;
		DownKeyShortPressFlag = FALSE;																												//作为长按键就将短按标志清零
		
		if (U8_KeyValue==POWER_KEY)																														//电源键长按下
		{
			PowerKeyLongPressFlag = TRUE;
		}
		else if (U8_KeyValue==UP_KEY)																													//上移键长按下
		{
			UpKeyLongPressFlag = TRUE;
		}
		else if (U8_KeyValue==DOWN_KEY)																												//下移键长按下
		{
			DownKeyLongPressFlag = TRUE;
		}
		else if (U8_KeyValue==UP_AND_DOWN_KEY)																								//上键和下键同时长按下
		{
			UpAndDownKeyLongPressFlag = TRUE;
		}
		
	}
	else																																										//没到长按键时间一律作为短按键处理
	{
		PowerKeyLongPressFlag = FALSE;
		UpKeyLongPressFlag = FALSE;
		DownKeyLongPressFlag = FALSE;																													//短按键清长按键标志
		
		if (u8_button_trigger==POWER_KEY)																											//电源键短按下
		{
			PowerKeyShortPressFlag = TRUE;
		}
		else if (u8_button_trigger==UP_KEY)																										//上移键短按下
		{
			UpKeyShortPressFlag = TRUE;
		}
		else if (u8_button_trigger==DOWN_KEY)																									//下移减短按下
		{
			DownKeyShortPressFlag = TRUE;
		}
	}

	if (U8_KeyValue==NO_KEY)																																//键释放就清键释放标志
	{
		KeyReleaseFlag = FALSE;
	}
}
 
/**************************************************************************
 * 函数名		：PowerButtonOperation()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2018-09-30
 * 函数描述 ：电源键操作。
 *************************************************************************/ 
 void PowerButtonOperation(void)
 {
		if (!KeyReleaseFlag)																																	//键释放了才去处理短按键操作
		{
			PowerKeyLongPressBackupFlag = FALSE;
			PowerKeyLongPressFlag = FALSE;																											//短按键操作中要将长按键标志清零防止长按键不正常
			
			if (PowerKeyShortPressFlag)																													//短按电源键
			{
				PowerKeyShortPressFlag = FALSE;																										// 
				
				/*短按键执行操作*/
				if (FunctionSetFlag)																															//进入设置状态
				{
					if (++U8_FunctionMenuIndex>16)																									//最大16个菜单选项
					{
						U8_FunctionMenuIndex = 0x01;																									//当菜单索引到最大就循环到菜单1
					}	
					U16_ParameterValueStep = SetStateFunctionShow(U8_FunctionMenuIndex);							//每切换一次菜单就重新调用之前保存的值
					U16_ParameterValueStepBackup = U16_ParameterValueStep;																//
				}
				else																																							//在工作状态
				{
					U8_DIS_ODO_VOL_Index++;																													//短按电源键显示将在单次里程，总里程和 电压直接切换
				}
			}
		}
		else if ((PowerKeyLongPressFlag)&&(PowerKeyLongPressBackupFlag!=PowerKeyLongPressFlag))	//长按电源键，并且只允许长按一次执行一次
		{
		 	PowerKeyLongPressBackupFlag = PowerKeyLongPressFlag;																//防止多次进入
			if (!FunctionSetFlag)																																//如果在设置状态不要允许关机
			{
				PWMCON += PWMSS;																																	//开PWM输出，点亮背光			
				POWER_HOLD_Bit = ~POWER_HOLD_Bit;																									//开机或关机
				
				if (POWER_HOLD_Bit)																																//处于开机状态就打开LCD
				{
					HT1621_Init();																																	//初始化液晶驱动			
				}
				else																																							//如果关机就关闭LCD
				{
					HT1621_Write_CMD(LCD_DISPLAY_OFF);																							//关LCD显示
				}
					
				ACC_POWER_Bit = POWER_HOLD_Bit;//for debug																				//电门锁和主电源状态一致
			 //BACKLIGHT_Bit = POWER_HOLD_Bit;//for debug		
			}		 
		}
		
 }
 
 /**************************************************************************
 * 函数名		：UpButtonOperation()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2018-09-30
 * 函数描述 ：增量键操作。
 *************************************************************************/
 void UpButtonOperation(void)
 {
		static unsigned char							u8_repetitive_operation_time = 0;
		static unsigned int								u16_odograph_number_reset_time = 0;
		
		if (!KeyReleaseFlag)																																	//键释放了才去处理短按键操作
		{
			UpKeyLongPressBackupFlag = FALSE;
			UpKeyLongPressFlag = FALSE;																													//短按键操作中要将长按键标志清零防止长按键不正常
			u8_repetitive_operation_time = 0;
			u16_odograph_number_reset_time = 0;
//----------------------------------------------------------------------------------------//
/*短按键执行操作*/			
			if (UpKeyShortPressFlag)																														//短按增量键
			{				
				if (FunctionSetFlag)																															//在设置状态
				{
					//ParameterAdjustment();
					U16_ParameterValueStep++;																												//
				}
				else																																							//非设置状态
				{
					if (U8_Gear_State<THREE_GREA_HELP)																							//档位加,档位不做循环处理
					{
						U8_Gear_State++;																															//
					}
				}
				
				UpKeyShortPressFlag = FALSE;																											//要放在设置执行完后清零 		
			}
//----------------------------------------------------------------------------------------//			
		}
		else if ((UpKeyLongPressFlag)/*&&(UpKeyLongPressBackupFlag!=UpKeyLongPressFlag)*/)				//长按上移键，并且只允许长按一次执行一次
		{
		 	//UpKeyLongPressBackupFlag = UpKeyLongPressFlag;																			//防止多次进入
			
			if (FunctionSetFlag)																																//在设置状态
			{
				if (++u8_repetitive_operation_time>20)																						//每100毫秒自动加一
				{
					U16_ParameterValueStep++;																												//
					u8_repetitive_operation_time = 0;
				}
				
				if (U8_FunctionMenuIndex==16)																											//在设定状态下的总里程显示状态下
				{
					u16_odograph_number_reset_time++;
					if (u16_odograph_number_reset_time>1000)																				//持续按下上键5秒清总里程
					{
						U16_OdographNumber = 0x00;
						OdographNumberWrite(ADDR_EXCURSION_ODO);																			//保存里程数
					}
				}
			}
			else
			{
				if (UpKeyLongPressBackupFlag!=UpKeyLongPressFlag)
				{
					UpKeyLongPressBackupFlag = UpKeyLongPressFlag;																	//防止多次进入
				}
			}
			
		}
 }

 /**************************************************************************
 * 函数名		：DownButtonOperation()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2018-09-30
 * 函数描述 ：减量键操作。
 *************************************************************************/
 void DownButtonOperation(void)
 {
		static unsigned char							u8_repetitive_operation_time = 0;
		
		if (!KeyReleaseFlag)																																	//键释放了才去处理短按键操作
		{
			DownKeyLongPressBackupFlag = FALSE;
			DownKeyLongPressFlag = FALSE;																												//短按键操作中要将长按键标志清零防止长按键不正常
			u8_repetitive_operation_time = 0;
//----------------------------------------------------------------------------------------//
/*短按键执行操作*/
			if (DownKeyShortPressFlag)																													//短按减量键
			{
				if (FunctionSetFlag)																															//在设置状态
				{
					//ParameterAdjustment();
					U16_ParameterValueStep--;
				}
				else																																							//非设置状态只允许执行一次，重复操作必须释放按键重新长按
				{
					if (U8_Gear_State>1)																														//档位减,档位不做循环处理
					{
						U8_Gear_State--;
					}
				} 
				DownKeyShortPressFlag = FALSE;																										//要放在设置执行完后清零 
			}
//----------------------------------------------------------------------------------------//			
		}
		else if ((DownKeyLongPressFlag)/*&&(DownKeyLongPressBackupFlag!=DownKeyLongPressFlag)*/)	//长按上移键，并且只允许长按一次执行一次
		{
		 //	DownKeyLongPressBackupFlag = DownKeyLongPressFlag;																	//防止多次进入	

			if (FunctionSetFlag)																																//在设置状态
			{
				if (++u8_repetitive_operation_time>10)																						//每100毫秒自动减一
				{
					U16_ParameterValueStep--;																												//
					u8_repetitive_operation_time = 0;
				}
			}
			else																																								//非设置状态只允许执行一次，重复操作必须释放按键重新长按
			{
				if (DownKeyLongPressBackupFlag!=DownKeyLongPressFlag)
				{
					DownKeyLongPressBackupFlag = DownKeyLongPressFlag;															//防止多次进入
				}
			}
		}
 }
 
 /**************************************************************************
 * 函数名		：UpAndDownButtonOperation()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2018-09-30
 * 函数描述 ：上下键同时长按下的操作。
 *************************************************************************/
	void UpAndDownButtonOperation(void)
	{
		if (!KeyReleaseFlag)																																	//按键释放清按键标志
		{
			UpAndDownKeyLongPressFlag = FALSE;
			UpAndDownKeyLongPressBackupFlag = FALSE;																						//
		}
		else if ((UpAndDownKeyLongPressFlag)&&(UpAndDownKeyLongPressBackupFlag!=UpAndDownKeyLongPressFlag))		//长按组合键，并且只允许长按一次执行一次
		{			
			UpAndDownKeyLongPressBackupFlag = UpAndDownKeyLongPressFlag;												//
			
			FunctionSetFlag = ~FunctionSetFlag;																									//进入或退出设置状态
			U8_FunctionMenuIndex = 0x01;																												//这个地方要初始化成1,因为第一次进入没有按切换键，会显示0，
			U16_ParameterValueStep = SetStateFunctionShow(U8_FunctionMenuIndex);								//每切换一次菜单就重新调用之前保存的值
			U16_ParameterValueStepBackup = U16_ParameterValueStep;															//
			U16_ParameterValueShowIndex = U8_BlacklightClass;																		//进入设置菜单的第一就是背光设置，所有要给功能区数码管显示初始值，否则会显示0
			U16_SetStateSilencePeriod = 0;																											//静默时间计数清零
			if (!FunctionSetFlag)																																//退出保存设置参数到EEPROM
			{
				FunctionSetSaveFlag = TRUE;
			}
		}	
//----------------------------------------------------------------------------------------//		
//设置状态静默10秒自动退出设置状态
		if (FunctionSetFlag)																																	//在设置状态就计数静默时间
		{
			U16_SetStateSilencePeriod++;
			if (U16_SetStateSilencePeriod>SILENCE_PERIOD)																				//超过10秒不操作就退出设置状态
			{
				FunctionSetFlag = FALSE;																													//退出设置状态
				FunctionSetSaveFlag = TRUE;																												//保存设置
			}
		}
//----------------------------------------------------------------------------------------//		
	} 
 

/**********************SINOWEALTH_SH79F083A**********END OF FILE*************************/
